iT邦幫忙

2024 iThome 鐵人賽

DAY 19
2
Kubernetes

都什麼年代了,還在學 Kubernetes系列 第 19

學 Kubernetes 的第十九天 - Workloads - Job & CronJob

  • 分享至 

  • xImage
  •  

在先前介紹的工作負載資源中,主要目的是部署需要持續運行的應用,如 DeploymentStatefulSet。然而,還有一類應用場景也是我們經常使用的,那就是一次性或週期性執行的任務型應用。

Kubernetes 給出的答案是:JobCronJob

概述

在 Kubernetes 中,Job 是一種控制器,用來管理一次性任務或批處理作業。Job 保證一組 Pod 能夠成功完成其工作,即使某些 Pod 因為各種原因失敗而需要重新啟動。當 Job 中的所有 Pod 成功完成任務後,Job 就會結束。

CronJob 是 Kubernetes 中用來管理定時任務的控制器。它允許用戶基於特定的時間間隔(類似於 Linux 系統中的 cron 作業)來安排和執行 Job。CronJob 會根據指定的時間表創建 Job,並讓這些 Job 在相應的時間執行。

應用場景

Job 應用場景

  1. 數據處理:定期運行的數據處理任務,如批量數據轉換、匯總等。
  2. 一次性任務:啟動某些需要在成功完成後停止的短期作業,如數據庫備份、文件處理等。
  3. 故障處理:當需要執行一次性的故障排查任務時,可以通過 Job 來完成。

CronJob 應用場景

  1. 定時備份:定期對數據庫或文件系統進行備份。
  2. 定期清理:定期清理舊的日誌文件、無用的資源等。
  3. 定時任務:每天、每週或每月執行的報告生成、狀態檢查或其他自動化任務。

組態檔案說明

Job 組態檔範例

apiVersion: batch/v1
kind: Job
metadata:
  name: example-job
spec:
  template:
    spec:
      containers:
      - name: example
        image: busybox
        command: ["echo", "Hello, Kubernetes!"]
      restartPolicy: Never
  backoffLimit: 4

這部分組態檔做的事:

  • 資源類型Job
  • 資源名稱example-job
  • Pod 模板:定義了 Job 中的 Pod,這裡使用 busybox 映像來執行一個簡單的 echo 命令。
  • 重啟策略restartPolicy: Never,表示 Pod 失敗後不會自動重啟。
  • backoffLimit:表示最多允許重試 4 次失敗的任務。

CronJob 組態檔範例

apiVersion: batch/v1
kind: CronJob
metadata:
  name: example-cronjob
spec:
  schedule: "*/5 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: example
            image: busybox
            command: ["echo", "Hello, CronJob!"]
          restartPolicy: OnFailure
  successfulJobsHistoryLimit: 3
  failedJobsHistoryLimit: 1

這部分組態檔做的事:

  • 資源類型CronJob
  • 資源名稱example-cronjob
  • 時間表schedule: "*/5 * * * *" 表示每 5 分鐘執行一次。
  • Job 模板:定義了 CronJob 將創建的 Job 的規格,使用 busybox 映像執行一個簡單的 echo 命令。
  • 重啟策略restartPolicy: OnFailure,表示 Pod 失敗後會自動重啟。
  • 歷史限制
    • successfulJobsHistoryLimit: 3,表示最多保留 3 個成功的 Job 記錄。
    • failedJobsHistoryLimit: 1,表示最多保留 1 個失敗的 Job 記錄。

實作

建立 Job

組態檔案: job.yaml

apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
    spec:
      containers:
      - name: pi
        image: perl:5.34.0
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never
  backoffLimit: 4

這個 Job 負責計算 π 到小數點後 2000 位,並將結果列印出來。 此計算大約需要 10 秒鐘完成。

  • 建立 Job
kubectl apply -f job.yaml
  • 查看 Job
kubectl describe job pi

結果如下

[...]
Events:
  Type    Reason            Age   From            Message
  ----    ------            ----  ----            -------
  Normal  SuccessfulCreate  18s   job-controller  Created pod: pi-tkz4l
  Normal  Completed         9s    job-controller  Job completed
  • 查看 log
kubectl logs pi-tkz4l

結果如下

3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632788659361533818279682303019520353018529689957736225994138912497217752834791315155748572424541506959508295331168617278558890750983817546374649393192550604009277016711390098488240128583616035637076601047101819429555961989467678374494482553797747268471040475346462080466842590694912933136770289891521047521620569660240580381501935112533824300355876402474964732639141992726042699227967823547816360093417216412199245863150302861829745557067498385054945885869269956909272107975093029553211653449872027559602364806654991198818347977535663698074265425278625518184175746728909777727938000816470600161452491921732172147723501414419735685481613611573525521334757418494684385233239073941433345477624168625189835694855620992192221842725502542568876717904946016534668049886272327917860857843838279679766814541009538837863609506800642251252051173929848960841284886269456042419652850222106611863067442786220391949450471237137869609563643719172874677646575739624138908658326459958133904780275901

要注意的是,Job 完成工作以後:

  • Pod 不會自動刪除: 即使 Job 完成,其所創建的 Pod 通常會保留一段時間,以便檢查 Pod 的日志、狀態等資訊。
  • Job 本身也不會立即刪除: Job 的資源對象會一直存在,除非手動刪除或觸發了自動刪除的機制。

建立 CronJob

組態檔案: cronjob.yaml

apiVersion: batch/v1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "* * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            imagePullPolicy: IfNotPresent
            command:
            - /bin/sh
            - -c
            - date
          restartPolicy: OnFailure

這個 CronJob 每分鐘執行一個 Job,印出當前時間

  • 建立 CronJob
kubectl apply -f cronjob.yaml
  • 查看 CronJob
kubectl get cronjob hello

結果如下

NAME    SCHEDULE    TIMEZONE   SUSPEND   ACTIVE   LAST SCHEDULE   AGE
hello   * * * * *   <none>     False     0        <none>          7s
  • 打開一個新終端 t1 ,使用 --watch flag 監控 Job 的變化
kubectl get jobs --watch
  • 等待幾分鐘,回到終端 t1 查看結果
NAME             STATUS    COMPLETIONS   DURATION   AGE
hello-28706092   Running   0/1                      0s
hello-28706092   Running   0/1           0s         0s
hello-28706092   Running   0/1           3s         3s
hello-28706092   Complete   1/1           3s         3s
hello-28706093   Running    0/1                      0s
hello-28706093   Running    0/1           0s         0s
hello-28706093   Running    0/1           3s         3s
hello-28706093   Complete   1/1           3s         3s
  • 查看最後一次執行的 Job,所建立的 Pod 日誌
pods=$(kubectl get pods --selector=job-name=hello-28706093 --output=jsonpath={.items..metadata.name})
kubectl logs $pods

結果如下

Tue Jul 30 18:53:00 UTC 2024

小結

JobCronJob 是 Kubernetes 中處理批量作業和定時任務的核心工具。Job 適合一次性執行的任務,而 CronJob 則適合需要定期執行的任務。這些控制器為處理各種自動化作業和批處理工作提供了靈活且強大的支持,使得運維和開發人員能夠輕鬆管理和調度任務。


上一篇
學 Kubernetes 的第十八天 - Workloads - StatefulSet
下一篇
學 Kubernetes 的第二十天 - Pod - Init Container
系列文
都什麼年代了,還在學 Kubernetes37
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言